const publicFn = {
	/**
	 * Loading等待
	 */
	Loading(msg) {
		let Msg = msg ? msg : "Loading";
		uni.showLoading({
			title: Msg,
			mask: true
		});
	},
	/**
	 * Loading取消
	 */
	LoadingOff() {
		uni.hideLoading();
	},
	/**
	 * Toast提示
	 */
	Toast(msg, icon, time) {
		let Icon = icon === 1 ? "success" : (icon === 2 ? "error" : "none");
		uni.showToast({
			title: msg,
			icon: Icon,
			duration: time || 2000
		});
	},
	/**
	 * 数字处理
	 * 
	 * 示例 checkDigit({ number: '', len: 2, max: 100000000, min: -1 })
	 * @param {Object} val
	 */
	checkDigit(val) {
		// 调用案例 checkDigit({ number: "", max: 100, min: -1 ,len: 2 })
		let {
			number = "", // 需要校验的数字
				len = "all", // 保留小数点后几位( 都保留传'all' )
				max = 9999999, // 最大值
				min = 0, // 最小值
		} = val;
		let x = number + "";
		x = x.replace(/\s+/g, ""); // 去除空格
		let _negatives = false;
		if (["0", "", "-0"].includes(x)) {
			if (x.includes("-")) {
				x = x.replace(/\-/gi, "")
			};
			return x;
		} else {
			let nums;
			if (x.includes(".")) {
				// 包含小数点
				nums = x.replace(/[^\d|\.\-]/g, "") // 提取出来 一定是数字
				if (nums.includes("-")) {
					// nums
					_negatives = true
					nums = nums.replace(/\-/gi, "");
				};
				let strL = nums.substring(0, nums.indexOf("."));
				let strR = nums.substring(nums.indexOf(".") + 1);
				strR = strR.replace(/\./gi, ""); // 去除多余小数点
				strL = strL.replace(/\./gi, ""); // 去除多余小数点
				if (strL === "" && strR === "") {
					nums = "0" // 有小数点，但左侧右侧都为空 默认为0
				} else if (strL === "" && strR !== "") {
					// 左侧为空 右侧不为空 小数
					if (len !== "all") {
						// 需要保留几位小数
						strR = strR.substr(0, len);
					};
					nums = "0." + strR;
				} else if (strL !== "" && strR === "") {
					// 右侧为空 左侧不为空 整数
					nums = strL;
				} else if (strL !== "" && strR !== "") {
					if (len !== "all") {
						// 需要保留几位小数
						strR = strR.substr(0, len);
					};
					nums = strL + "." + strR;
				};
			} else {
				if (x.includes("-")) {
					nums = x.replace(/\-/gi, "");
					_negatives = true
				};
				nums = x.replace(/[^\d|\.]/g, ""); // 提取出来 一定是数字
			};
			// 经过校验处理还为空 输入的值不是数字
			// if (nums === "") {
			// 	return nums
			// } else {
			// 	nums = nums * 1 + ""
			// }
			let z = nums;
			_negatives && nums && ((z = "-" + nums), (_negatives = false));
			// 手动设置了最大值
			if (max !== Infinity) {
				z = z > max ? max : z;
			};
			// 手动设置了最小值
			if (min !== 5e-324) {
				z = z < min ? min : z;
			};
			x = z + "";
		};
		return x // 返回处理结果
	},
	/**
	 * 手机状态栏高度
	 */
	navBarHeight() {
		return uni.getSystemInfoSync().statusBarHeight;
	},

	/**
	 * 节流函数
	 * @methods 需节流的函数
	 * @info 需节流的函数参数1
	 * @info1 需节流的函数参数2
	 */
	// singleClick(methods, info, info1) {
	// 	// console.log(info, info1);
	// 	let that = this;
	// 	if (that.noClick) {
	// 		// 第一次点击
	// 		that.noClick = false;
	// 		if (info != undefined && info1 == undefined) {
	// 			// info是执行函数需要传的参数
	// 			methods(info);
	// 		} else if (info != undefined && info1 != undefined) {
	// 			methods(info, info1);

	// 		} else {
	// 			methods();
	// 		}
	// 		setTimeout(() => {
	// 			that.noClick = true;
	// 		}, 2000)
	// 	} else {
	// 		// 这里是重复点击的判断
	// 	}
	// }

	/* 仿jsonp接口 */
	jsonp(url, data) {
		return new Promise((resolve, reject) => {
			// 1.初始化url
			let dataString = url.indexOf('?') === -1 ? '?' : '&'
			let callbackName = `jsonpCB_${ Date.now() }`;
			url += `${ dataString }callback=${ callbackName }`
			if (data) {
				// 2.有请求参数，依次添加到url
				for (let k in data) {
					url += `&${ k }=${ data[k] }`
				}
			}
			let scriptNode = document.createElement('script');
			scriptNode.src = url;
			// 3. callback
			window[callbackName] = (result) => {
				result ? resolve(result) : reject('没有返回数据');
				delete window[callbackName];
				document.body.removeChild(scriptNode);
			}
			// 4. 异常情况
			scriptNode.addEventListener('error', () => {
				reject('接口返回数据失败');
				delete window[callbackName];
				document.body.removeChild(scriptNode);
			}, false)
			// 5. 开始请求
			document.body.appendChild(scriptNode)
		})
	},

	/* 添加ref的class */
	// 判断ref是否有该class
	hasClass(ref_info, class_name) {
		let reg = new RegExp("(^|\\s)" + class_name + "($|\\s)");
		// 区分是否为组件内，使用需要用 $el
		if (ref_info.$el) {
			return reg.test(ref_info.$el.className);
		} else {
			return reg.test(ref_info.className);
		}
	},
	refAddClass(ref_info, class_name) {
		if (this.hasClass(ref_info, class_name)) return;
		// 区分是否为组件内，使用需要用 $el
		let class_name_arr = [];

		if (ref_info.$el) {
			if (ref_info.$el.className === undefined) {
				// 判断是否为空
				class_name_arr = ref_info.$el.className.split(" ");
			} else {
				class_name_arr = ref_info.$el.className.split(" ");
			}
		} else {
			if (ref_info.className !== undefined) {
				// 判断是否为空
				class_name_arr = ref_info.className.split(" ");
			} else {
				class_name_arr = ref_info[0].className.split(" ");
			}
		}
		class_name_arr.push(class_name);
		// 区分是否为组件内，使用需要用 $el
		if (ref_info.$el) {
			if (ref_info.$el.className === undefined) {
				ref_info.$el.className = class_name_arr.join(" ");
			} else {
				ref_info.$el.className = class_name_arr.join(" ");
			}
		} else {
			if (ref_info.className !== undefined) {
				// 判断是否为空
				ref_info.className = class_name_arr.join(" ");
			} else {
				ref_info[0].className = class_name_arr.join(" ");
			}
		}
	},
	/* 删除ref的class */
	refRemoveClass(ref_info, class_name) {
		ref_info.forEach((element) => {
			// 区分是否为组件内，使用需要用 $el
			let class_name_arr = element.$el ?
				element.$el.className.split(" ") :
				element.className.split(" ");
			let index = class_name_arr.findIndex((item) => {
				return item == class_name;
			});
			if (index !== -1) class_name_arr.splice(index, 1);
			// 区分是否为组件内，使用需要用 $el
			if (element.$el) {
				element.$el.className = class_name_arr.join(" ");
			} else {
				element.className = class_name_arr.join(" ");
			}
		});
	},

	/* 数组判断是否相同 */
	compareArray(a1, a2) {
		if (a1 === a2) return true;
		if ((!a1 && a2) || (a1 && !a2)) return false;
		if (a1.length !== a2.length) return false;
		for (var i = 0, n = a1.length; i < n; i++) {
			if (a1[i] !== a2[i]) return false;
		}
		return true;
	}
};

// module.exports = publicFn;
export default publicFn;
